package com.lsabcd.dubbo.test;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lidingbo
 * @date 2020/7/30 14:32
 * @description
 */
public class LimiterManager {
    public static LimiterManager getInstance(){
        if (null == instance) {
            synchronized (LimiterManager.class) {
                if (null == instance) {
                    instance = new LimiterManager();
                }
            }
        }
        return instance;
    }
    public void collect(String methodName,WindowItem item){
        WindowContainer container = limiterMap.get(methodName);
        if (null == container) {
            synchronized (limiterMap) {
                if (limiterMap.get(methodName) == null) {
                    container = new WindowContainer();
                    limiterMap.put(methodName,container);
                }
            }
        }
        container.submit(item);
    }
    public void statistics(){
        System.out.println("Do statistics");
        limiterMap.forEach( (k,v) ->{
            System.out.println(k);
            System.out.println(v.getContainer());
            Map<String, WindowItem> map = v.statistics();
            System.out.println(k + ": " + map);
        });
    }


    private static volatile LimiterManager instance = null;

    private volatile Map<String, WindowContainer> limiterMap = new HashMap<String, WindowContainer>();

    /**
     * 1. 编写一个Dubbo服务，提供3个方法（methodA、methodB、methodC），每方法都实现了随机休眠0-100ms
     *
     * 2. 编写一个消费端程序，不断调用Dubbo服务的3个方法（建议利用线程池进行并行调用，确保在1分钟内可以被调用2000次以上）
     *
     * 3. 利用TPMonitorFilter在消费端记录每个方法的请求耗时时间（异步调用不进行记录）
     *
     * 4. 每隔5s打印一次最近1分钟内每个方法的TP90、TP99的耗时情况
     */

}
